/* 在创建线程时，不用重复使用保存线程参数的变量就，除非确信线程已经完成了对参数的访问
 * 由于变量是通过引用传递的，因此，最好为每个线程使用一个单独的变量。
 * 该程序中用一个简单的示例说明了可能出现的错误。程序创建了10个线程，每个线程都输出其
 * 参数的值。main程序将线程创建循环索引i作为它传递给线程的参数。每个线程都打印它接收到
 * 的参数值。如果main程序在线程i值打印出来之前就修改了它，则线程就可能会得到一个不正确的值。
 */
// 未将参数正确地传递给多个线程的程序
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <string.h>

#define NUMTHREADS 10

static void *printarg(void *arg) {
    // sleep(1);
    fprintf(stderr, "Thread received %d\n", *(int *)arg);
    return NULL;
}

// 程序未将参数正确地传递给线程
int main (void) {
    int error, i, j;
    pthread_t tid[NUMTHREADS];

    for (i = 0; i < NUMTHREADS; i++) {
        if (error = pthread_create(tid + i, NULL, printarg, (void *)&i)) {
            fprintf(stderr, "Failed to create thread: %s\n", strerror(error));
            tid[i] = pthread_self();
        }
        sleep(1);
    }
    
    for (j = 0; j < NUMTHREADS; j++) {
        if (pthread_equal(pthread_self(), tid[j])) continue;

        if (error = pthread_join(tid[j], NULL)) {
            fprintf(stderr, "Failed to join thread: %s\n", strerror(error));
        }
    }

    printf("ALL threads done\n");
    return 0;
}